<?php

namespace App;

use Lsf\Exception\FinishException;

/**
 * 应用全局基类
 * @author zhuliu
 * $Id: application.php $
 */

///usr/local/php/bin/php
// 模块命名空间
define('APP_NAME_USER', 'home');
define('APP_NAME_DEVICE', 'device');
define('APP_NAME_QUESTION', 'question');

// 公共响应错误码
define('ECODE_SUCCESS', 0);               // 成功
define('ECODE_PARAM_MISSING', 9010000);   // 缺失参数
define('ECODE_PARAM_VALUE_INVALID', 9010001);   // 参数值非法
define('DATABASE_OPERATE_FAIL', 9010002); // 数据库操作失败
define('JSON_FAIL', 9010003); // 数据库操作失败
define('SVR_FAIL', 9010004); // 数据库操作失败

class Application extends \Lsf\Controller {
	const SERVER_SWITCH_CODE = 10002;

	// 用户uid（帐号systemId）
	protected $uid = 0;
	// 登录态token
	protected $token = '';
	// 用户信息
	protected $userInfo = [];
	// 无需检查token的路由
	protected $noNeedCheckTokenRouter = [
		'url' => 1,
	];

	/**
	 * 构造器
	 * @param $appName
	 * @param $controllerName
	 * @param $actionName
	 * @throws FinishException
	 */
	public function __construct($appName, $controllerName, $actionName) {
		parent::__construct($appName, $controllerName, $actionName);
		// 先执行全局的初始化方法
		$this->uid = $this->post('uid', TRUE);
		$this->token = $this->post('token', TRUE);
		// 接口限流器
		//$this->_apiCurrentLimiter($this->uid);
		// 再执行每个app自定义的初始化方法
		$this->initAppsApplication();
	}

	/**
	 * 接口限流器
	 * @param $uid
	 * @throws FinishException
	 */
	private function _apiCurrentLimiter($uid) {
		$config = \Lsf\Loader::plugin('ConfigCenter')->group('api_current_limter');
		if (isset($config['uris']) && !empty($config['uris'])) {
			$router = '/' . $this->appName . '/' . $this->controllerName . '/' . uncamelize($this->actionName);
			$uriArr = json_decode($config['uris'], TRUE);
			if (isset($uriArr[$router])) {
				$ratio = (int)$uriArr[$router];
				if ($ratio <= 0) {
					$result = FALSE;
				} else {
					if ($ratio >= 100) {
						$result = TRUE;
					} else {
						$uid = (int)$uid;
						$num = $uid > 0 ? $uid : mt_rand(81000000000, 81999999999);
						$value = ($num % 100) + 1;
						$result = $value > $ratio ? FALSE : TRUE;
					}
				}
				if ($result === FALSE) {
					throw new FinishException($this->json(9999998));
				}
			}
		}
	}

	/**
	 * 缺失参数
	 */
	public function errParamMissing($eCode, $paramName) {
		return $this->json($eCode, ['param_name' => $paramName]);
	}

	/**
	 * 参数值非法
	 */
	public function errParamValueInvalid($eCode, $paramName, $value) {
		return $this->json($eCode, ['param_name' => $paramName, 'value' => $value]);
	}
}

